//
// Copyright (C) [2020] Futurewei Technologies, Inc.
//
// FORCE-RISCV is licensed under the Apache License, Version 2.0 (the "License");
//  you may not use this file except in compliance with the License.
//  You may obtain a copy of the License at
//
//  http://www.apache.org/licenses/LICENSE-2.0
//
// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR
// FIT FOR A PARTICULAR PURPOSE.
// See the License for the specific language governing permissions and
// limitations under the License.
//

/*  !!! NOTICE !!!
    This file is automatically generated by the script: utils/enum_classes/create_enum_files.py
    Please do not modify this file manually.  Instead, modify the above mentioned script to re-generate this file.
*/

#ifndef Force_EnumsFPIX_H
#define Force_EnumsFPIX_H

#include <string>

namespace Force {


  /*!
    Types of simulator events
  */
  enum class ESimThreadEventType : unsigned char {
    START_TEST = 0,
    END_TEST = 1,
    RESET = 2,
    BOOT_CODE = 3,
    FIRST_INSTRUCTION = 4,
    PRE_STEP = 5,
    STEP = 6,
    POST_STEP = 7,
    MEMORY_UPDATE = 8,
    MMU_EVENT = 9,
    REGISTER_UPDATE = 10,
    DELAY = 11,
    INTERRUPT = 12,
    EXCEPTION_EVENT = 13,
    UNKNOWN_EVENT = 14,
  };
  extern unsigned char ESimThreadEventTypeSize;
  extern const std::string ESimThreadEventType_to_string(ESimThreadEventType in_enum); //!< Get string name for enum.
  extern ESimThreadEventType string_to_ESimThreadEventType(const std::string& in_str); //!< Get enum value for string name.
  extern ESimThreadEventType try_string_to_ESimThreadEventType(const std::string& in_str, bool& okay); //!< Try to get enum value for string name, set status to indicate if conversion successful. Return value is indeterminate on failure.
  typedef unsigned char ESimThreadEventTypeBaseType; //!< Define a type name for the enum base data type.


  /*!
    Simulator options
  */
  enum class EOptionIndex : unsigned char {
    UNKNOWN = 0,
    CFG = 1,
    HELP = 2,
    LOGLEVEL = 3,
    SEED = 4,
    MAX_INSTS_OPT = 5,
    RAILHOUSE_OPT = 6,
    DECODING_OPT = 7,
    CORE_NUM_OPT = 8,
    CLUSTER_NUM_OPT = 9,
    THREADS_PER_CPU_OPT = 10,
    PA_SIZE_OPT = 11,
    EXIT_LOOP_OPT = 12,
    PLUGIN = 13,
    PLUGINS_OPTIONS = 14,
  };
  extern unsigned char EOptionIndexSize;
  extern const std::string EOptionIndex_to_string(EOptionIndex in_enum); //!< Get string name for enum.
  extern EOptionIndex string_to_EOptionIndex(const std::string& in_str); //!< Get enum value for string name.
  extern EOptionIndex try_string_to_EOptionIndex(const std::string& in_str, bool& okay); //!< Try to get enum value for string name, set status to indicate if conversion successful. Return value is indeterminate on failure.
  typedef unsigned char EOptionIndexBaseType; //!< Define a type name for the enum base data type.


  /*!
    Operand types in the instruction files
  */
  enum class EOperandType : unsigned char {
    Register = 0,
    GPR = 1,
    VECREG = 2,
  };
  extern unsigned char EOperandTypeSize;
  extern const std::string EOperandType_to_string(EOperandType in_enum); //!< Get string name for enum.
  extern EOperandType string_to_EOperandType(const std::string& in_str); //!< Get enum value for string name.
  extern EOperandType try_string_to_EOperandType(const std::string& in_str, bool& okay); //!< Try to get enum value for string name, set status to indicate if conversion successful. Return value is indeterminate on failure.
  typedef unsigned char EOperandTypeBaseType; //!< Define a type name for the enum base data type.


  /*!
    Types of resource access age.
  */
  enum class EAccessAgeType : unsigned char {
    Invalid = 0,
    Read = 1,
    Write = 2,
  };
  extern unsigned char EAccessAgeTypeSize;
  extern const std::string EAccessAgeType_to_string(EAccessAgeType in_enum); //!< Get string name for enum.
  extern EAccessAgeType string_to_EAccessAgeType(const std::string& in_str); //!< Get enum value for string name.
  extern EAccessAgeType try_string_to_EAccessAgeType(const std::string& in_str, bool& okay); //!< Try to get enum value for string name, set status to indicate if conversion successful. Return value is indeterminate on failure.
  typedef unsigned char EAccessAgeTypeBaseType; //!< Define a type name for the enum base data type.


  /*!
    Types of resource dependency.
  */
  enum class EDependencyType : unsigned char {
    OnSource = 0,
    OnTarget = 1,
  };
  extern unsigned char EDependencyTypeSize;
  extern const std::string EDependencyType_to_string(EDependencyType in_enum); //!< Get string name for enum.
  extern EDependencyType string_to_EDependencyType(const std::string& in_str); //!< Get enum value for string name.
  extern EDependencyType try_string_to_EDependencyType(const std::string& in_str, bool& okay); //!< Try to get enum value for string name, set status to indicate if conversion successful. Return value is indeterminate on failure.
  typedef unsigned char EDependencyTypeBaseType; //!< Define a type name for the enum base data type.

}

#endif
